#include "GeometricAnalysis.h"


GeometricAnalysis::GeometricAnalysis ()
	:  SD1(0), SD2(0), TINN(0), M(0), N(0), HRVTriangularIndex(0), Y(0), X(0), HistogramBinLength(7.8125), SamplingInterval(360)
{}

GeometricAnalysis::~GeometricAnalysis (void)
{}

void GeometricAnalysis::runModule(const ECGInfo &info, const ECGRs &ecgRs, ECGHRV2 &ecgHRV2)
{
	#ifdef DEVELOPMENT
		this->rpeaks = MakeRRsignal();
	#else
		this->rpeaks = ecgRs;
		this->SamplingInterval = (double)info.channel_one.frequecy;
	#endif

	PrepareRRSignal();
	MakeHistogramAndGeometricalParams();
	MakePoincareAndSDParams();
	SetHRV2Params(ecgHRV2);
}

// "histogram_bin_length" - szerokosc slupka histogramu
void GeometricAnalysis::setParams(ParametersTypes &parameterTypes)
{
	if(parameterTypes.find("histogram_bin_length") != parameterTypes.end())
	{
		double HistogramParameter = (double)parameterTypes["histogram_bin_length"];
		this->HistogramBinLength = HistogramParameter;
	}

}

// funkcja przeksztalca wektor numerow probek z zalamkami R na wektor interwalow RR
void GeometricAnalysis::PrepareRRSignal()
{

	unsigned int rpeaks_size = rpeaks.GetRs()->signal->size;

	RR_intervals = OtherSignal(new WrappedVector);
	RR_intervals->signal = gsl_vector_alloc(rpeaks_size-1);

	#ifdef DEVELOPMENT
		for(int i = 0; i < rpeaks_size-1; i++) 
		{
			int Value = gsl_vector_int_get (rpeaks.GetRs()->signal, i);
			gsl_vector_set(RR_intervals->signal, i, Value);
		}
	#else
		for(int i = 0; i < rpeaks_size-1; i++) 
		{
			int Value1 = gsl_vector_int_get (rpeaks.GetRs()->signal, i);
			int Value2 = gsl_vector_int_get (rpeaks.GetRs()->signal, i+1);
			double Result = (double)abs(Value2-Value1);
			gsl_vector_set(RR_intervals->signal, i, Result);
		}

		gsl_vector_scale(RR_intervals->signal,(double)((1/SamplingInterval)*1000));
	#endif
	
}

// funkcja oblicza punkty wykresu histogramu, punkty trojkata aproksymyjacego histogram, parametry: indeks trojkatny, indeks TINN 
void GeometricAnalysis::MakeHistogramAndGeometricalParams()
{

	double RRmax = gsl_vector_max(RR_intervals->signal);
	double RRmin = gsl_vector_min(RR_intervals->signal);
	double length = RRmax-RRmin;
	int index_hist = (int)length/HistogramBinLength;

	IntSignal Histogram = IntSignal(new WrappedVectorInt);
	Histogram->signal = gsl_vector_int_alloc(index_hist);

	unsigned int RR_intervals_size = RR_intervals->signal->size;

	for(int i=0; i < index_hist; i++)
	{
		gsl_vector_int_set(Histogram->signal, i,0);

		for(int j=0; j < RR_intervals_size; j++)
		{
			auto value = gsl_vector_get(RR_intervals->signal, j);

			if(value > (RRmin + (i * HistogramBinLength ) ) )
			{
				if(value < (RRmin + ( (i+1) * HistogramBinLength ) ) )
				{
					auto oldvalue = gsl_vector_int_get(Histogram->signal, i); 
					gsl_vector_int_set(Histogram->signal, i,oldvalue+1);
				}
			}
		}
	}

	unsigned int Y = gsl_vector_int_max(Histogram->signal);
	unsigned int X = gsl_vector_int_max_index(Histogram->signal);

	double minimum = 0;
	//double globalminimum = 10000000000000;
	double globalminimum = 0;
	bool setglobalminimum = false;
	int N = 0;
	int M = 0;
	double x[3] = { N, X, M };
	double y[3] = { 0, Y, 0 };

	gsl_interp *interpolation = gsl_interp_alloc (gsl_interp_linear,3);
	gsl_interp_accel * accelerator =  gsl_interp_accel_alloc();

	unsigned Histogram_size = Histogram->signal->size;

	for(int index_N=0; index_N < X-1; index_N++)
	{
		for(int index_M=X+1; index_M < Histogram_size; index_M++)
		{
			x[0] = index_N; x[2] = index_M;

			gsl_interp_init(interpolation, x, y, 3);

			for(int i=0; i < index_N; i++)
			{
				int HistogramValue = gsl_vector_int_get(Histogram->signal, i);
				minimum = minimum + (double)(HistogramValue*HistogramValue);
			}

			for(int i=index_N+1; i < index_M-1; i++)
			{
				int LinearValue = gsl_interp_eval(interpolation, x, y, i, accelerator);
				int HistogramValue = gsl_vector_int_get(Histogram->signal, i);
				minimum = minimum + (double)( ( LinearValue - HistogramValue ) * ( LinearValue - HistogramValue ) );
			}

			for(int i=index_M; i < Histogram_size; i++)
			{
				auto HistogramValue = gsl_vector_int_get(Histogram->signal, i);
				minimum = minimum + (double)(HistogramValue*HistogramValue);
			}

			if(!setglobalminimum)
			{
				globalminimum = minimum;
				setglobalminimum=true;
			}

			if(minimum <= globalminimum)
			{
				globalminimum=minimum;
				N=index_N;
				M=index_M;
			}
			minimum=0;
		}
	}

	histogram_y = IntSignal(new WrappedVectorInt);
	histogram_y->signal = gsl_vector_int_alloc(index_hist);
	histogram_x = IntSignal(new WrappedVectorInt);
	histogram_x->signal = gsl_vector_int_alloc(index_hist);

	gsl_vector_int_memcpy(this->histogram_y->signal,Histogram->signal);

	for(int i = 0; i < index_hist; i++) 
	{
		gsl_vector_int_set(this->histogram_x->signal, i, i);
	}
	this->N=N;
	this->M=M;
	this->X=X;
	this->Y=Y;
	this->HRVTriangularIndex = (double)((double)RR_intervals_size/(double)Y);
	this->TINN = (M - N)*HistogramBinLength;

}

// funkcja oblicza punkty wykresu Poincare oraz parametry SD1 i SD2
void GeometricAnalysis::MakePoincareAndSDParams()
{
	unsigned int RR_intervals_size = RR_intervals->signal->size;

	poincare_x = IntSignal(new WrappedVectorInt);
	poincare_x->signal = gsl_vector_int_alloc(RR_intervals_size-1);
	poincare_y = IntSignal(new WrappedVectorInt);
	poincare_y->signal = gsl_vector_int_alloc(RR_intervals_size-1);
	IntSignal diff = IntSignal(new WrappedVectorInt);
	diff->signal = gsl_vector_int_alloc(RR_intervals_size-1);

	double *data_SDNN = new double[RR_intervals_size-1];

	for(int i = 0; i < RR_intervals_size; i++) 
	{
		double SignalValue = gsl_vector_get (RR_intervals->signal, i);
		data_SDNN[i] = SignalValue;
		if(i < RR_intervals_size-1) gsl_vector_int_set(poincare_x->signal, i, SignalValue);
		if(i > 0) gsl_vector_int_set(poincare_y->signal, i-1, SignalValue);
	}

	double sdnn = gsl_stats_sd(data_SDNN,1,RR_intervals_size-1);

	gsl_vector_int_memcpy(diff->signal, poincare_y->signal);
	gsl_vector_int_sub(diff->signal,poincare_x->signal);

	double *data_DIFF = new double[RR_intervals_size-1];

	for(int i = 0; i < RR_intervals_size-1; i++) 
	{
		double SignalValue = gsl_vector_int_get (diff->signal, i);
		data_DIFF[i] = SignalValue;
	}

	double sdsd = gsl_stats_sd(data_DIFF,1,RR_intervals_size-1);

	double SD1 = (double)sqrt(0.5*pow(sdsd,2));
	double SD2 = (double)sqrt(2*pow(sdnn,2) - 0.5*pow(sdsd,2));
	this->SD1 = SD1;
	this->SD2 = SD2;
}

//funckja przesyla wszystkie dane do obiektu klasy ECGHRV2
void GeometricAnalysis::SetHRV2Params(ECGHRV2 &hrv2)
{
	hrv2.SetSD1(this->SD1);
	hrv2.SetSD2(this->SD2);
	hrv2.SetTINN(this->TINN);
	hrv2.SetM(this->M);
	hrv2.SetN(this->N);
	hrv2.SetHRVTriangularIndex(this->HRVTriangularIndex);
	hrv2.SetY(this->Y);
	hrv2.SetX(this->X);
	hrv2.SetHistogramBinLength(this->HistogramBinLength);

	hrv2.SetHistogram_x(histogram_x);
	hrv2.SetHistogram_y(histogram_y);
	hrv2.SetPoincare_x(poincare_x);
	hrv2.SetPoincare_y(poincare_y);


}

//funkcja tworzaca testowy wektor interwalow RR
ECGRs GeometricAnalysis::MakeRRsignal()
{
	int RRsignal[] = {
		1974,
		1974,
		1075,
		1023,
		1001,
		1102,
		1049,
		1023,
		1016,
		979	,
		1074,
		1061,
		1017,
		1015,
		997	,
		992	,
		1081,
		1038,
		1017,
		995	,
		999	,
		1076,
		1099,
		1039,
		1046,
		1072,
		1059,
		1121,
		1082,
		1026,
		1044,
		1023,
		1061,
		1097,
		1015,
		1013,
		996	,
		1090,
		1054,
		1052,
		999	,
		997	,
		1032,
		1030,
		1041,
		1017,
		947	,
		950	,
		1045,
		1009,
		1022,
		976	,
		965	,
		964	,
		1056,
		1019,
		1027,
		970	,
		968	,
		1028,
		1044,
		1006,
		1017,
		968	,
		931	,
		1053,
		1010,
		992	,
		996	,
		946	,
		964	,
		1039,
		1016,
		988	,
		981	,
		932	,
		509	,
		1522,
		993	,
		1021,
		967	,
		939	,
		1025,
		1045,
		969	,
		998	,
		981	,
		956	,
		1048,
		1041,
		998	,
		1008,
		962	,
		1041,
		1051,
		1024,
		1016,
		1011,
		985	,
		1060,
		1052,
		1027,
		985	,
		1007,
		1065,
		1055,
		1046,
		1014,
		1029,
		1039,
		1064,
		1063,
		1044,
		991	,
		506	,
		1550,
		1079,
		1030,
		1026,
		992	,
		1047,
		1046,
		1031,
		1027,
		992	,
		972	,
		1069,
		1028,
		1012,
		1031,
		972	,
		1043,
		1051,
		1053,
		1022,
		1018,
		966	,
		1075,
		1058,
		997	,
		1027,
		984	,
		984	,
		1073,
		1008,
		988	,
		1009,
		935	,
		1059,
		1047,
		995	,
		1000,
		1000,
		994	,
		1072,
		1044,
		1011,
		1015,
		986	,
		1053,
		1079,
		1023,
		1001,
		1044,
		1003,
		1081,
		1065,
		991	,
		1028,
		976	,
		1060,
		1078,
		1000,
		1009,
		1000,
		571	,
		1454,
		1038,
		990	,
		979	,
		926	,
		1054,
		1006,
		1030,
		981	,
		988	,
		982	,
		1065,
		1041,
		1054,
		1015,
		972	,
		1113,
		1055,
		1046,
		1042,
		990	,
		1015,
		1074,
		1034,
		1042,
		972	,
		971	,
		487	,
		1571,
		994	,
		999	,
		952	,
		950	,
		1023,
		1011,
		954	,
		978	,
		943	,
		969	,
		1044,
		1008,
		985	,
		1002,
		951	,
		909	,
		1215,
		1024,
		1034,
		990	,
		474	,
		1034,
		1465,
		1014,
		1039,
		578	,
		1416,
		1073,
		1032,
		1011,
		781	,
		1225,
		1074,
		1088,
		1009,
		574	,
		1432,
		1059,
		1068,
		1027,
		1000,
		1023,
		974	,
		1068,
		1044,
		1020,
		990	,
		978	,
		1056,
		991	,
		1098,
		1013,
		1005,
		1015,
		1069,
		1053,
		1047,
		884	,
		1024,
		1201,
		1051,
		1031,
		499	,
		1463,
		1064,
		1066,
		1017,
		572	,
		1418,
		963	,
		1080,
		1013,
		478	,
		1440,
		982	,
		930	,
		1035,
		993	,
		956	,
		955	,
		932	,
		930	,
		1022,
		970	,
		976	,
		976	,
		953	,
		990	,
		1053,
		967	,
		989	,
		961	,
		944	,
		1015,
		1034,
		991	,
		988	,
		1011,
		971	,
		1070,
		1055,
		985	,
		991	,
		962	,
		1009,
		1008,
		400	,
		1488,
		968	,
		913	,
		986	,
		1016,
		935	,
		954	,
		940	,
		939	,
		995	,
		1017,
		976	,
		953	,
		963	,
		983	,
		1003,
		1027,
		979	,
		935	,
		969	,
		1002,
		1026,
		859	,
		1152,
		970	,
		934	,
		1043,
		973	,
		1029,
		977	,
		599	,
		1343,
		1054,
		1001,
		1000,
		983	,
		922	,
		1026,
		1043,
		982	,
		1039,
		977	,
		976	,
		1053,
		1051,
		999	,
		1014,
		837	,
		1153,
		1068,
		1020,
		992	,
		997	,
		950	,
		1039,
		1063,
		1002,
		1009,
		1017,
		984	,
		602	,
		1511,
		1022,
		1035,
		955	,
		590	,
		1518,
		1026,
		998	,
		991	,
		711	,
		1324,
		1076,
		978	,
		986	,
		960	,
		1007,
		1025,
		1005,
		963	,
		994	,
		967	,
		1022,
		1042,
		880	,
		1084,
		980	,
		968	,
		1037,
		1008,
		995	,
		973	,
		984	,
		1040,
		1061,
		1001,
		1029,
		995	,
		536	,
		1546,
		1076,
		1065,
		1014,
		1029,
		1104,
		1098,
		1056,
		1045,
		620	,
		1508,
		1107,
		1044,
		1050,
		1015,
		1022,
		1117,
		1035,
		1031,
		1047,
		927	,
		1160,
		1066,
		1019,
		1014,
		985	,
		752	,
		1352,
		1008,
		1021,
		983	,
		980	,
		1044,
		1073,
		994	,
		993	,
		1026,
		1029,
		1076,
		1058,
		1033,
		575	,
		1463,
		1111,
		1101,
		1009,
		576	,
		1420,
		1088,
		1058,
		975	,
		1026,
		976	,
		1010,
		1028,
		1055,
		985	,
		762	,
		1148,
		1047,
		1034,
		1011,
		604	,
		1351,
		475	,
		1486,
		1029,
		981	,
		959	,
		947	,
		951	,
		1033,
		1017,
		1008,
		985	,
		945	,
		1059,
		1055,
		1011,
		1029,
		981	,
		957	,
		1081,
		611	,
		1427,
		1008,
		949	,
		1014,
		1058,
		944	,
		1084,
		1007,
		964	,
		1087,
		1067,
		1010,
		1042,
		986	,
		1034,
		1074,
		986	,
		1045,
		1020,
		965	,
		1064,
		1039,
		1008,
		980	,
		541	,
		1427,
		1080,
		1031,
		1003,
		439	,
		1461,
		1046,
		1009,
		981	,
		934	,
		941	,
		937	,
		952	,
		982	,
		943	,
		933	,
		916	,
		904	,
		956	,
		917	,
		950	,
		906	,
		896	,
		901	,
		966	,
		966	,
		918	,
		913	,
		872	,
		913	,
		934	,
		938	,
		917	,
		924	,
		879	,
		870	,
		895	,
		944	,
		898	,
		861	,
		875	,
		840	,
		893	,
		904	,
		882	,
		859	,
		878	,
		848	,
		818	,
		937	,
		900	,
		870	,
		889	,
		857	,
		831	,
		903	,
		931	,
		889	,
		846	,
		866	,
		861	,
		815	,
		942	,
		883	,
		845	,
		859	,
		767	,
		870	,
		852	,
		911	,
		881	,
		826	,
		842	,
		853	,
		816	,
		878	,
		914	,
		854	,
		858	,
		847	,
		856	,
		880	,
		898	,
		923	,
		866	,
		855	,
		867	,
		876	,
		902	,
		933	,
		885	,
		898	,
		861	,
		866	,
		962	,
		955	,
		961	,
		914	,
		922	,
		871	,
		1014,
		953	,
		947	,
		937	,
		890	,
		877	,
		970	,
		949	,
		904	,
		924	,
		876	,
		855	,
		980	,
		942	,
		932	,
		925	,
		909	,
		886	,
		963	,
		1004,
		951	,
		974	,
		926	,
		906	,
		1012,
		1010,
		936	,
		998	,
		934	,
		910	,
		996	,
		998	,
		931	,
		964	,
		916	,
		897	,
		977	,
		980	,
		671	,
		469	,
		474	,
		446	,
		738	,
		396	,
		894	,
		1198,
		984	,
		940	,
		944	,
		888	,
		961	,
		989	,
		961	,
		950	,
		947	,
		897	,
		1016,
		993	,
		957	,
		937	,
		948	,
		908	,
		983	,
		995	,
		968	,
		937	,
		960	,
		942	,
		1004,
		1013,
		988	,
		954	,
		703	,
		1276,
		1019,
		1006,
		972	,
		905	,
		973	,
		1016,
		995	,
		959	,
		985	,
		939	,
		956	,
		813	,
		1239,
		999	,
		994	,
		961	,
		1000,
		1039,
		594	,
		1398,
		972	,
		929	,
		1020,
		1001,
		982	,
		955	,
		944	,
		860	,
		985	,
		964	,
		935	,
		916	,
		886	,
		841	,
		954	,
		956	,
		870	,
		884	,
		884	,
		860	,
		865	,
		949	,
		922	,
		900	,
		874	,
		883	,
		846	,
		965	,
		935	,
		880	,
		906	,
		906	,
		866	,
		957	,
		988	,
		928	,
		925	,
		922	,
		881	,
		947	,
		989	,
		905	,
		933	,
		899	,
		879	,
		948	,
		978	,
		915	,
		896	,
		886	,
		871	,
		920	,
		950	,
		923	,
		914	,
		883	,
		899	,
		929	,
		936	,
		985	,
		907	,
		896	,
		915	,
		929	,
		954	,
		960	,
		934	,
		901	,
		895	,
		732	,
		1195,
		991	,
		958	,
		924	,
		933	,
		927	,
		1024,
		957	,
		954	,
		918	,
		916	,
		971	,
		1013,
		766	,
		1179,
		929	,
		915	,
		988	,
		1012,
		941	,
		987	,
		921	,
		904	,
		619	,
		1364,
		938	,
		964	,
		915	,
		887	,
		987	,
		988	,
		921	,
		958	,
		902	,
		860	,
		943	,
		969	,
		900	,
		940	,
		919	,
		849	,
		968	,
		985	,
		907	,
		932	,
		912	,
		882	,
		955	,
		992	,
		952	,
		936	,
		918	,
		873	,
		985	,
		962	,
		943	,
		929	,
		923	,
		888	,
		933	,
		961	,
		929	,
		891	,
		895	,
		863	,
		921	,
		963	,
		930	,
		888	,
		883	,
		888	,
		879	,
		943	,
		932	,
		905	,
		882	,
		858	,
		910	,
		923	,
		938	,
		878	,
		895	,
		882	,
		862	,
		965	,
		916	,
		883	,
		921	,
		864	,
		856	,
		989	,
		955	,
		922	,
		920	,
		910	,
		872	,
		991	,
		971	,
		918	,
		896	,
		890	,
		860	,
		905	,
		967	,
		917	,
		893	,
		904	,
		894	,
		873	,
		979	,
		923	,
		896	,
		895	,
		884	,
		864	,
		991	,
		934	,
		896	,
		906	,
		904	,
		862	,
		961	,
		960	,
		858	,
		894	,
		871	,
		830	,
		902	,
		938	,
		905	,
		860	,
		872	,
		896	,
		881	,
		973	,
		941	,
		878	,
		892	,
		890	,
		892	,
		929	,
		960	,
		884	,
		898	,
		890	,
		843	,
		947	,
		975	,
		910	,
		905	,
		889	,
		887	,
		967	,
		931	,
		927	,
		890	,
		887	,
		838	,
		932	,
		937	,
		916	,
		900	,
		850	,
		483	,
		1261,
		748	,
		1037,
		877	,
		501	,
		1196,
		815	,
		935	,
		883	,
		849	,
		880	,
		823	,
		830	,
		862	,
		934	,
		896	,
		851	,
		871	,
		849	,
		830	,
		918	,
		912	,
		865	,
		898	,
		871	,
		836	,
		908	,
		967	,
		930	,
		881	,
		908	,
		869	,
		884	,
		937	,
		927	,
		872	,
		896	,
		880	,
		838	,
		941	,
		966	,
		874	,
		899	,
		898	,
		837	,
		940	,
		930	,
		891	,
		870	,
		876	,
		836	,
		851	,
		907	,
		907	,
		841	,
		853	,
		858	,
		805	,
		907	,
		877	,
		867	,
		853	,
		852	,
		854	,
		873	,
		919	,
		925	,
		882	,
		874	,
		880	,
		853	,
		910	,
		903	,
		919	,
		865	,
		839	,
		860	,
		900	,
		909	,
		903	,
		876	,
		856	,
		867	,
		904	,
		905	,
		907	,
		891	,
		855	,
		862	,
		876	,
		916	,
		911	,
		850	,
		912	,
		860	,
		819	,
		962	,
		916	,
		908	,
		885	,
		881	,
		847	,
		895	,
		973	,
		900	,
		873	,
		888	,
		864	,
		843	,
		968	,
		898	,
		850	,
		861	,
		885	,
		820	,
		920	,
		955	,
		877	,
		881	,
		881	,
		877	,
		907	,
		983	,
		922	,
		862	,
		882	,
		875	,
		844	,
		915	,
		923	,
		846	,
		867	,
		846	,
		822	,
		902	,
		925	,
		891	,
		836	,
		843	,
		865	,
		839	,
		874	,
		913	,
		845	,
		859	,
		848	,
		848	,
		898	,
		930	,
		914	,
		866	,
		865	,
		856	,
		866	,
		900	,
		910	,
		847	,
		840	,
		844	,
		841	,
		912	,
		888	,
		884	,
		866	,
		847	,
		833	,
		894	,
		891	,
		885	,
		857	,
		831	,
		837	,
		822	,
		916	,
		905	,
		886	,
		894	,
		858	,
		830	,
		938	,
		945	,
		881	,
		901	,
		850	,
		842	,
		846	,
		950	,
		884	,
		856	,
		882	,
		849	,
		815	,
		919	,
		931	,
		861	,
		869	,
		863	,
		828	,
		871	,
		901	,
		910	,
		836	,
		882	,
		841	,
		808	,
		905	,
		909	,
		878	,
		861	,
		875	,
		850	,
		875	,
		938	,
		938	,
		869	,
		885	,
		874	,
		849	,
		916	,
		907	,
		881	,
		857	,
		877	,
		827	,
		892	,
		920	,
		898	,
		858	,
		854	,
		853	,
		858	,
		911	,
		893	,
		882	,
		845	,
		869	,
		849	,
		883	,
		909	,
		888	,
		851	,
		823	,
		843	,
		836	,
		880	,
		886	,
		853	,
		829	,
		828	,
		820	,
		890	,
		905	,
		869	,
		882	,
		842	,
		870	,
		890	,
		903	,
		922	,
		877	,
		892	,
		875	,
		881	,
		943	,
		944	,
		880	,
		897	,
		860	,
		815	,
		911	,
		886	,
		889	,
		838	,
		842	,
		832	,
		813	,
		911	,
		867	,
		832	,
		833	,
		815	,
		769	,
		828	,
		873	,
		823	,
		794	,
		782	,
		790	,
		736	,
		777	,
		893	,
		818	,
		781	,
		801	,
		787	,
		787	,
		813	,
		887	,
		870	,
		792	,
		809	,
		815	,
		768	,
		857	,
		884	,
		857	,
		809	,
		801	,
		819	,
		807	,
		848	,
		892	,
		858	,
		796	,
		807	,
		815	,
		811	,
		875	,
		878	,
		829	,
		826	,
		802	,
		808	,
		827	,
		844	,
		900	,
		819	,
		819	,
		819	,
		793	,
		860	,
		831	,
		859	,
		807	,
		781	,
		775	,
		793	,
		838	,
		821	,
		879	,
		791	,
		781	,
		796	,
		759	,
		862	,
		825	,
		852	,
		807	,
		766	,
		800	,
		768	,
		854	,
		865	,
		842	,
		813	,
		804	,
		807	,
		810	,
		886	,
		859	,
		860	,
		870	,
		796	,
		821	,
		870	,
		889	,
		883	,
		858	,
		831	,
		822	,
		789	,
		877	,
		888	,
		847	,
		834	,
		829	,
		802	,
		794	,
		889	,
		867	,
		818	,
		836	,
		831	,
		779	,
		805	,
		856	,
		862	,
		824	,
		817	,
		818	,
		777	,
		850	,
		857	,
		846	,
		798	,
		804	,
		811	,
		762	,
		841	,
		861	,
		866	,
		790	,
		793	,
		807	,
		773	,
		861	,
		856	,
		860	,
		809	,
		788	,
		820	,
		778	,
		857	,
		824	,
		862	,
		800	,
		788	,
		817	,
		786	,
		862	,
		852	,
		812	,
		829	,
		779	,
		800	,
		790	,
		852	,
		825	,
		841	,
		807	,
		762	,
		839	,
		813	,
		861	,
		847	,
		837	,
		807	,
		770	,
		801	,
		837	,
		822	,
		832	,
		795	,
		790	,
		783	,
		774	,
		836	,
		822	,
		811	,
		802	,
		809	,
		770	,
		769	,
		860	,
		829	,
		846	,
		796	,
		802	,
		794	,
		782	,
		857	,
		865	,
		846	,
		798	,
		827	,
		777	,
		770	,
		877	,
		830	,
		832	,
		801	,
		827	,
		783	,
		768	,
		923	,
		875	,
		845	,
		852	,
		835	,
		821	,
		810	,
		931	,
		882	,
		831	,
		856	,
		861	,
		788	,
		877	,
		928	,
		815	,
		818	,
		791	,
		811	,
		760	,
		827	,
		884	,
		803	,
		783	,
		785	,
		783	,
		772	,
		828	,
		867	,
		830	,
		784	,
		779	,
		815	,
		793	,
		838	,
		876	,
		831	,
		798	,
		789	,
		815	,
		784	,
		844	,
		869	,
		803	,
		809	,
		798	,
		802	,
		810	,
		847	,
		860	,
		815	,
		805	,
		806	,
		788	,
		865	,
		872	,
		893	,
		829	,
		802	,
		808	,
		779	,
		858	,
		815	,
		859	,
		805	,
		774	,
		795	,
		769	,
		852	,
		850	,
		837	,
		823	,
		771	,
		804	,
		766	,
		861	,
		869	,
		822	,
		834	,
		813	,
		794	,
		806	,
		902	,
		841	,
		847	,
		865	,
		791	,
		808	,
		845	,
		885	,
		856	,
		838	,
		855	,
		823	,
		796	,
		893	,
		896	,
		860	,
		858	,
		828	,
		824	,
		811	,
		869	,
		890	,
		823	,
		841	,
		836	,
		793	,
		843	,
		890	,
		882	,
		792	,
		841	,
		812	,
		745	,
		856	,
		854	,
		827	,
		774	,
		774	,
		797	,
		739	,
		823	,
		850	,
		840	,
		778	,
		790	,
		804	,
		773	,
		824	,
		857	,
		856	,
		811	,
		798	,
		837	,
		796	,
		853	,
		861	,
		857	,
		802	,
		785	,
		824	,
		769	,
		829	,
		847	,
		819	,
		798	,
		788	,
		798	,
		775	,
		835	,
		823	,
		810	,
		809	,
		751	,
		807	,
		769	,
		798	,
		822	,
		787	,
		804	,
		745	,
		779	,
		761	,
		788	,
		818	,
		784	,
		762	,
		756	,
		744	,
		739	,
		796	,
		771	,
		790	,
		773	,
		761	,
		755	,
		756	,
		784	,
		817	,
		814	,
		775	,
		800	,
		752	,
		752	,
		787	,
		838	,
		813	,
		803	,
		839	,
		786	,
		784	,
		819	,
		852	,
		817	,
		770	,
		782	,
		785	,
		743	,
		762	,
		872	,
		817	,
		778	,
		816	,
		792	,
		771	,
		778	,
		884	,
		675	,
		939	,
		860	,
		803	,
		788	,
		757	,
		868	,
		712	,
		879	,
		811	,
		757	,
		766	,
		733	,
		802	,
		830	,
		764	,
		550	,
		861	,
		764	,
		696	,
		779	,
		800	,
		772	,
		732	,
		751	,
		733	,
		750	,
		748	,
		788	,
		823	,
		765	,
		756	,
		757	,
		750	,
		755	,
		804	,
		806	,
		821	,
		752	,
		761	,
		766	,
		760	,
		786	,
		828	,
		823	,
		771	,
		789	,
		792	,
		787	,
		863	,
		854	,
		888	,
		836	,
		796	,
		827	,
		822	,
		858	,
		856	,
		844	,
		814	,
		801	,
		775	,
		814	,
		839	,
		813	,
		822	,
		799	,
		781	,
		805	,
		798	,
		862	,
		855	,
		829	,
		825	,
		761	,
		776	,
		810	,
		814	,
		806	,
		795	,
		762	,
		754	,
		752	,
		730	,
		837	,
		793	,
		800	,
		775	,
		777	,
		777	,
		742	,
		875	,
		865	,
		809	,
		846	,
		817	,
		782	,
		793	,
		923	,
		859	,
		792	,
		839	,
		805	,
		784	,
		809	,
		870	,
		878	,
		806	,
		841	,
		819	,
		754	,
		849	,
		868	,
		831	,
		793	,
		821	,
		776	,
		771	,
		838	,
		828	,
		854	,
		778	,
		792	,
		799	,
		753	,
		834	,
		847	,
		840	,
		766	,
		803	,
		793	,
		747	,
		809	,
		836	,
		857	,
		786	,
		798	,
		810	,
		731	,
		821	,
		843	,
		811	,
		782	,
		753	,
		784	,
		736	,
		765	,
		801	,
		826	,
		763	,
		753	,
		761	,
		763	,
		763	,
		838	,
		805	,
		801	,
		782	,
		762	,
		779	,
		751	,
		801	,
		803	,
		793	,
		776	,
		766	,
		768	,
		756	,
		809	,
		789	,
		810	,
		777	,
		745	,
		772	,
		738	,
		781	,
		822	,
		783	,
		770	,
		753	,
		733	,
		738	,
		774	,
		787	,
		794	,
		730	,
		785	,
		745	,
		720	,
		794	,
		795	,
		797	,
		800	,
		764	,
		775	,
		759	,
		725	,
		826	,
		808	,
		793	,
		768	,
		787	,
		773	,
		734	,
		2551,
		810	,
		835	,
		799	,
		760	,
		877	,
		831	,
		797	,
		746	,
		778	,
		743	,
		695	,
		781	,
		795	,
		768	,
		717	,
		726	,
		725	,
		718	,
		673	,
		786	,
		766	,
		742	,
		710	,
		703	,
		717	,
		709	,
		692	,
		772	,
		773	,
		724	,
		711	,
		708	,
		701	,
		658	,
		716	,
		751	,
		739	,
		697	,
		685	,

};
	
	int RRsignal_length = 1874;

	IntSignal RR = IntSignal(new WrappedVectorInt);
	RR->signal = gsl_vector_int_alloc(RRsignal_length);

	for(int i = 0; i < RRsignal_length; i++)
	{
		gsl_vector_int_set(RR->signal, i, RRsignal[i]);
	}

	ECGRs rs;
	rs.setRs(RR);

	return rs;
}